﻿using System;
using System.Collections.Generic;
using System.Net;

namespace CGF
{
    public class MsgPacker
    {
        private int HeadLength = 4;

        private List<byte> bytesPool = new List<byte>();

        public static byte[] AddHead(byte[] sendBytes)
        {
            byte[] byteLen = IntToBytes(sendBytes.Length);
            List<byte> all = new List<byte>();
            all.AddRange(byteLen);
            all.AddRange(sendBytes);
            return all.ToArray();
        }

        public void OnReceiveBytes(byte[] recBytes, Action<byte[]> onPack)
        {
            bytesPool.AddRange(recBytes);
            while (bytesPool.Count > HeadLength)
            {
                List<byte> head = bytesPool.GetRange(0, HeadLength);
                int bodyLeng = BytesToInt(head.ToArray());
                if (bodyLeng > 0 && bytesPool.Count - HeadLength >= bodyLeng)
                {
                    bytesPool.RemoveRange(0, HeadLength);
                    List<byte> body = bytesPool.GetRange(0, bodyLeng);
                    bytesPool.RemoveRange(0, bodyLeng);
                    onPack(body.ToArray());
                }
                else
                {
                    break;
                }
            }
        }

        public static byte[] IntToBytes(int data)
        {
            byte[] bytes = BitConverter.GetBytes(data);
            if (BitConverter.IsLittleEndian)
            {
                //转成大端
                Array.Reverse(bytes);
            }
            return bytes;
        }

        public static int BytesToInt(byte[] data)
        {
            int value = BitConverter.ToInt32(data, 0);
            if (BitConverter.IsLittleEndian)
            {
                //转成大端
                return IPAddress.HostToNetworkOrder(value);
            }
            else
            {
                return value;
            }
        }
    }
}
